<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="pragma" content="no-cache" />
    <meta http-equiv="Cache-Control" content="no-cache, must-revalidate" />
    <meta http-equiv="expires" content="0" />
    <title>行业解决方案</title>
</head>
<body>
    <canvas id="exampleCanvas" width="400" height="700" style="position: fixed; left: 0px; top: 0px;" />
    <script type="text/javascript" src="facecat.js"></script>
    <script type="text/javascript">
        let canvas = document.getElementById("exampleCanvas"); //绘图区域
        canvas.width = window.innerWidth;
        canvas.height = window.innerHeight;
        let gPaint = new FCPaint(); //绘图对象
        gPaint.canvas = canvas;
        scaleCanvas(gPaint);
        //判断主题色
        gPaint.defaultUIStyle = "dark";
        let url = location.href;
        if (url.indexOf("color=light") != -1) {
            gPaint.defaultUIStyle = "light";
        }
        //判断移动端
        gPaint.isMobile = isMobileMode();
        if (gPaint.isMobile) {
            gPaint.scaleFactorX = 2.5;
            gPaint.scaleFactorY = 2.5;
        }
        let gList = new FCGrid();
        gList.dock = "fill";
        addView(gList, gPaint);
        if (gList.paint.defaultUIStyle == "dark") {
            gList.backColor = "rgb(0,0,0)";
            gList.borderColor = null;
            gList.textColor = "rgb(255,255,255)";
            gList.scrollBarColor = "rgb(100,100,100)";
        } else if (gList.paint.defaultUIStyle == "light") {
            gList.backColor = "rgb(230,230,230)";
            gList.borderColor = null;
            gList.textColor = "rgb(0,0,0)";
            gList.scrollBarColor = "rgb(200,200,200)";
        }
        gList.visible = true;
        gList.rowHeight = 80;
        gList.headerHeight = 5;
        let gColumn = new FCGridColumn();
        gColumn.text = "";
        gColumn.widthStr = "100%";
        gList.columns.push(gColumn);
        if (gList.paint.defaultUIStyle == "dark") {
            gColumn.backColor = "rgb(0,0,0)";
            gColumn.borderColor = "rgb(100,100,100)";
            gColumn.textColor = "rgb(255,255,255)";
        } else if (gList.paint.defaultUIStyle == "light") {
            gColumn.backColor = "rgb(255,255,255)";
            gColumn.borderColor = "rgb(150,150,150)";
            gColumn.textColor = "rgb(0,0,0)";
        }
        let onClick = function (view, firstTouch, firstPoint, secondTouch, secondPoint, clicks) {
            onClickDefault(view, firstTouch, firstPoint, secondTouch, secondPoint, clicks);
        };
        let onMouseDown = function (view, mp, buttons, clicks, delta) {
            onMouseDownDefault(view, mp, buttons, clicks, delta);
        };
        let onMouseWheel = function (view, mp, buttons, clicks, delta) {
            if (window.event.ctrlKey && view.paint) {
                //放大显示
                if (delta < 0) {
                    view.paint.scaleFactorX = view.paint.scaleFactorX + 0.1;
                    view.paint.scaleFactorY = view.paint.scaleFactorY + 0.1;
                    resizeAll();
                    //缩小显示
                } else if (delta > 0) {
                    if (view.paint.scaleFactorX > 0.2) {
                        view.paint.scaleFactorX = view.paint.scaleFactorX - 0.1;
                        view.paint.scaleFactorY = view.paint.scaleFactorY - 0.1;
                        resizeAll();
                    }
                }
                return;
            }
            replayTick = 0;
            tick = 0;
            clickIndex = -1;
            onMouseWheelDefault(view, mp, buttons, clicks, delta);
        };
        let onTouchBegin = function (view, firstTouch, firstPoint, secondTouch, secondPoint) {
            onTouchBeginDefault(view, firstTouch, firstPoint, secondTouch, secondPoint);
        };
        let onTouchMove = function (view, firstTouch, firstPoint, secondTouch, secondPoint) {
            onTouchMoveDefault(view, firstTouch, firstPoint, secondTouch, secondPoint);
            if(firstTouch){
                clickIndex = -1;
                tick = 0;
                replayTick = 0;
            }
        };
        let onTouchEnd = function (view, firstTouch, firstPoint, secondTouch, secondPoint) {
            onTouchEndDefault(view, firstTouch, firstPoint, secondTouch, secondPoint);
        };
        let buttonRects = [];
        let mouseMovePoint = new FCPoint();
        let onMouseMove = function (view, mp, buttons, clicks, delta) {
            mouseMovePoint = mp;
            onMouseMoveDefault(view, mp, buttons, clicks, delta);
            invalidateView(view);
            if(buttons != 0){
                clickIndex = -1;
                tick = 0;
                replayTick = 0;
            }
            let hoverButton = false;
            for(let i = 0; i < buttonRects.length; i++){
                let rect = buttonRects[i];
                if(mp.x >= rect.left && mp.x <= rect.right && mp.y >= rect.top && mp.y <= rect.bottom){
                    hoverButton = true;
                    break;
                }
            }
            if(hoverButton){
                gPaint.canvas.style.cursor = "pointer";
            }else{
                gPaint.canvas.style.cursor = "";
            }
        };
        let onMouseUp = function (view, mp, buttons, clicks, delta) {
            onMouseUpDefault(view, mp, buttons, clicks, delta);
        };
        gPaint.onUpdateView = function (views) {
            updateViewDefault(views);
        }

        //注册事件
        addMouseDownEvent(canvas, gPaint, onMouseDown);
        addMouseMoveEvent(canvas, gPaint, onMouseMove);
        addMouseWheelEvent(canvas, gPaint, onMouseWheel);
        addMouseUpEvent(canvas, gPaint, onMouseUp, onClick);
        addTouchBeginEvent(canvas, gPaint, onTouchBegin);
        addTouchMoveEvent(canvas, gPaint, onTouchMove);
        addTouchEndEvent(canvas, gPaint, onTouchEnd, onClick);

        /*
        * 重置大小
        */
        let resizeAll = function () {
            canvas.width = document.documentElement.clientWidth;
            canvas.height = document.documentElement.clientHeight;
            scaleCanvas(gPaint);
            updateViewDefault(gPaint.views);
            invalidate(gPaint);
        };

        /*
        * 监听大小改变
        */
        window.onresize = function () {
            resizeAll();
        };

        /*
        * 旋转监听
        */
        window.onorientationchange = function () {
            resizeAll();
        };

        /*
        * 绘制单元格
        * grid:表格
        * row:行
        * column:列
        * cell:单元格
        * paint:绘图对象
        * left:左侧坐标
        * top:上方坐标
        * right:右侧坐标
        * bottom:下方坐标
        */
        gPaint.onPaintGridCell = function (grid, row, column, cell, paint, left, top, right, bottom) {
            let width = right - left, height = bottom - top;
            let colors = new Array();
            colors.push("rgb(170, 178, 189)");
            colors.push("rgb(140, 192, 81)");
            colors.push("rgb(59, 174, 218)");
            colors.push("rgb(219, 68, 83)");
            colors.push("rgb(246, 187, 67)");
            colors.push("rgb(216, 112, 173)");
            colors.push("rgb(150, 123, 220)");
            colors.push("rgb(75, 137, 220)");
            colors.push("rgb(185, 63, 150)");
            colors.push("rgb(233, 87, 62)");
            if (!gPaint.isMobile && width > 500) {
                let dColor = "rgba(50,50,50)";
                if (grid.paint.defaultUIStyle == "dark") {
                    paint.fillRoundRect("rgba(21,24,28,150)", left + 14, top + 5, right - 14, bottom - 5, 8);
                } else {
                    dColor = "rgb(200,200,200)";
                    paint.fillRoundRect("rgb(240,240,240)", left + 14, top + 5, right - 14, bottom - 5, 0);
                    paint.drawRoundRect(dColor, 1, 0, left + 14, top + 5, right - 14, bottom - 5, 0)
                }
            } else {
                if (grid.paint.defaultUIStyle == "dark") {
                    paint.fillRoundRect("rgb(21,24,28)", left + 14, top + 5, right - 14, bottom - 5, 10);
                } else {
                    paint.fillRoundRect("rgb(240,240,240)", left + 14, top + 5, right - 14, bottom - 5, 10);
                }
            }
            let baseUpper = cell.text1;
            if (cell.text3 == "关于" && !gPaint.isMobile && width > 600) {
                baseUpper = "上海卷卷猫信息技术有限公司 版权所有@2023 " + baseUpper;
            }
            let font1 = "Default,15";
            let font2 = "Default,12";
            let font3 = "Default,14";
            let tSize = paint.textSize(baseUpper, font1);
            if (cell.text3 == "关于") {
                if (grid.paint.defaultUIStyle == "dark") {
                    paint.drawText(baseUpper, "rgb(200,200,200)", font1, left + (width - tSize.cx) / 2, top + (height - tSize.cy) / 2); 
                } else {
                    paint.drawText(baseUpper, "rgb(50,50,50)", font1, left + (width - tSize.cx) / 2, top + (height - tSize.cy) / 2); 
                }
                return;
            }
            let str = "A" + tSize.cy;
            if (str == "ANaN") {
                tSize.cy = 12;
            }
            let strVolume = cell.text3;
            let strPrice = cell.text4;
            let tSize2 = paint.textSize(strVolume, font2);
            str = "A" + tSize2.cy;
            if (str == "ANaN") {
                tSize2.cy = 12;
            }
            if (grid.paint.defaultUIStyle == "dark") {
                paint.drawText(baseUpper, "rgb(200,200,200)", font1, left + 26, top + height / 2 - tSize2.cy - tSize.cy / 2);
                paint.drawText(strVolume, "rgb(200,200,200)", font2, left + 39, top + height / 2 + tSize2.cy + 3 - tSize2.cy / 2);
            } else {
                paint.drawText(baseUpper, "rgb(50,50,50)", font1, left + 26, top + height / 2 - tSize2.cy - tSize.cy / 2);
                paint.drawText(strVolume, "rgb(50,50,50)", font2, left + 39, top + height / 2 + tSize2.cy + 3 - tSize2.cy / 2);
            }
            let drawColor = "rgb(255,0,0)";
            paint.fillEllipse(colors[Number(cell.linkType) - 1], left + 26, top + height / 2 + 3 + tSize2.cy - 4, left + 34, top + height / 2 + 3 + tSize2.cy + 4);
            let tSize5 = paint.textSize("100000.00%", font3);
            str = "A" + tSize5.cy;
            if (str == "ANaN") {
                tSize5.cy = 12;
            }
            let rate2 = 1 - 210 / width;
            if (gPaint.isMobile) {
                rate2 = 0.5;
            }
            let colRect = new FCRect(left + width * rate2 + 5, top + height / 2 - tSize5.cy - 4, left + width * rate2 + 5 + tSize5.cx, top + height / 2 + tSize5.cy + 3);
            if (!gPaint.isMobile && width > 500) {
                if (grid.paint.defaultUIStyle == "dark") {
                    paint.drawTextAutoEllipsis(strPrice, "rgb(200,200,200)", font3, left + 200 + 30, top + height / 2 - tSize5.cy / 2, width - 260, left + 230 + 5 + tSize5.cy - tSize5.cy / 2);
                } else {
                    paint.drawTextAutoEllipsis(strPrice, "rgb(50,50,50)", font3, left + 200 + 30, top + height / 2 - tSize5.cy / 2, width - 260, left + 230 + 5 + tSize5.cy - tSize5.cy / 2);
                }
                if (grid.paint.defaultUIStyle == "dark") {
                    paint.drawLine("rgb(0,0,0)", 2, 0, width - 240, top + 5, width - 240, bottom - 5);
                    paint.drawLine("rgb(0,0,0)", 2, 0, left + 210, top + 5, left + 210, bottom - 5);
                } else {
                    paint.drawLine("rgb(200,200,200)", 1, 0, width - 240, top + 5, width - 240, bottom - 5);
                    paint.drawLine("rgb(200,200,200)", 1, 0, left + 210, top + 5, left + 210, bottom - 5);
                }
                //paint.drawLine("rgb(50,50,50)", 1, 0, left + 200 + 5 - 10, top, left + 200 + 5 - 10, bottom);
                //paint.drawLine("rgb(50,50,50)", 1, 0, width - 220, top, width - 220, bottom);
            }
            if (grid.paint.defaultUIStyle == "dark") {
                if (!gPaint.isMobile && width > 500) {
                    paint.fillRoundRect("rgba(32,36,38,100)", colRect.left, top + 15, colRect.right, bottom - 15, 5);
                }else{
                    paint.fillRoundRect("rgba(32,36,38)", colRect.left, top + 15, colRect.right, bottom - 15, 5);
                }
                //paint.drawRoundRect("rgb(75,75,75)", 1, 0, colRect.left, colRect.top, colRect.right, colRect.bottom, 10);
            } else {
                paint.fillRoundRect("rgb(255,255,255)", colRect.left, top + 15, colRect.right, bottom - 15, 5);
                paint.drawRoundRect("rgb(200,200,200)", 1, 0, colRect.left, top + 15, colRect.right, bottom - 15, 5);
            }

            if(mouseMovePoint.x >= colRect.left && mouseMovePoint.x <= colRect.right && mouseMovePoint.y >= top + 15 && mouseMovePoint.y <= bottom - 15){
                paint.drawRoundRect("rgb(42,138,195)", 1, 0, colRect.left, top + 15, colRect.right, bottom - 15, 5);
            }
            buttonRects.push(new FCRect(colRect.left, top + 15, colRect.right, bottom - 15));

            let diffX = colRect.right - colRect.left + 10;
            if (cell.linkText2.length > 0) {
                if (grid.paint.defaultUIStyle == "dark") {
                    if (!gPaint.isMobile && width > 500) {
                        paint.fillRoundRect("rgba(32,36,38,100)", colRect.left + diffX, top + 15, colRect.right + diffX, bottom - 15, 5);
                    }else{
                        paint.fillRoundRect("rgb(32,36,38)", colRect.left + diffX, top + 15, colRect.right + diffX, bottom - 15, 5);
                    }
                    //paint.drawRoundRect("rgb(75,75,75)", 1, 0, colRect.left + diffX, colRect.top, colRect.right + diffX, colRect.bottom, 4);
                } else {
                    paint.fillRoundRect("rgb(255,255,255)", colRect.left + diffX, top + 15, colRect.right + diffX, bottom - 15, 5);
                    paint.drawRoundRect("rgb(200,200,200)", 1, 0, colRect.left + diffX, top + 15, colRect.right + diffX, bottom - 15, 5);
                }
                if(mouseMovePoint.x >= colRect.left + diffX && mouseMovePoint.x <= colRect.right + diffX && mouseMovePoint.y >= top + 15 && mouseMovePoint.y <= bottom - 15){
                    paint.drawRoundRect("rgb(42,138,195)", 1, 0, colRect.left + diffX, top + 15, colRect.right + diffX, bottom - 15, 5);
                }
                buttonRects.push(new FCRect(colRect.left + diffX, top + 15, colRect.right + diffX, bottom - 15));
            }
            cell.diffX = diffX;
            let tSize4 = paint.textSize(cell.linkText1, font3);
            let tSize6 = paint.textSize(cell.linkText2, font3);
            let offsetRight = 15;
            if (cell.image) {
                if (!cell.initImage) {
                    cell.initImage = true;
                    let image = new Image();
                    image.onload = function () {
                        cell.image2 = image;
                        invalidateView(grid);
                    };
                    image.src = cell.image;
                }
            }
            if (grid.paint.defaultUIStyle == "dark") {
                paint.drawText(cell.linkText1, "rgb(200,200,200)", font3, left + width * rate2 + 5 + tSize5.cx / 2 - tSize4.cx / 2 - 15, top + height / 2 - tSize4.cy / 2);
            } else {
                paint.drawText(cell.linkText1, "rgb(50,50,50)", font3, left + width * rate2 + 5 + tSize5.cx / 2 - tSize4.cx / 2 - 15, top + height / 2 - tSize4.cy / 2);
            }
            let tLeft1 = left + width * rate2 + 5 + tSize5.cx / 2 - tSize4.cx / 2 - 15 + tSize4.cx + 10;
            let tLeftRect = new FCRect(tLeft1 + 2, top + height / 2 - 10, tLeft1 + 20 - 2, top + height / 2 + 10);
            if(cell.linkText1 == "图片"){
                tLeftRect.top += 1;
                tLeftRect.bottom -= 1;
                tLeftRect.left -= 1;
                tLeftRect.right += 1;
                paint.drawRoundRect("rgb(140,192,81)", 1, 0, tLeftRect.left, tLeftRect.top, tLeftRect.right, tLeftRect.bottom, 2);
                let points1 = new Array();
                points1.push(new FCPoint(tLeftRect.left + 1, tLeftRect.bottom));
                points1.push(new FCPoint(tLeftRect.left + 5, tLeftRect.bottom - 12));
                points1.push(new FCPoint(tLeftRect.left + 12, tLeftRect.bottom));
                paint.fillPolygon("rgb(140,192,81)", points1);
                let points2 = new Array();
                points2.push(new FCPoint(tLeftRect.left + 7, tLeftRect.bottom));
                points2.push(new FCPoint(tLeftRect.left + 11, tLeftRect.bottom - 10));
                points2.push(new FCPoint(tLeftRect.left + 15, tLeftRect.bottom));
                paint.fillPolygon("rgb(140,192,81)", points2);
                let lR = 2;
                paint.fillEllipse("rgb(140,192,81)", tLeftRect.left + (tLeftRect.right - tLeftRect.left) * 3 / 4 - lR, 
                tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4 - lR, tLeftRect.left + (tLeftRect.right - tLeftRect.left) * 3 / 4 + lR, 
                tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4 + lR);
            }else{
                if (grid.paint.defaultUIStyle == "dark") {
                    paint.drawRoundRect("rgb(170,178,189)", 1, 0, tLeftRect.left, tLeftRect.top, tLeftRect.right, tLeftRect.bottom, 2);
                    paint.drawLine("rgb(170,178,189)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4);
                    paint.drawLine("rgb(170,178,189)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 2, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 2);
                    paint.drawLine("rgb(170,178,189)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) * 3 / 4, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) * 3 / 4);
                } else {
                    paint.drawRoundRect("rgb(175,175,175)", 1, 0, tLeftRect.left, tLeftRect.top, tLeftRect.right, tLeftRect.bottom, 2);
                    paint.drawLine("rgb(175,175,175)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4);
                    paint.drawLine("rgb(175,175,175)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 2, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 2);
                    paint.drawLine("rgb(175,175,175)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) * 3 / 4, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) * 3 / 4);
                }
            }
            if (cell.linkText2.length > 0) {
                if (cell.image2) {
                    let tLeft = left + width * rate2 + 5 + tSize5.cx / 2 - tSize6.cx / 2 + diffX - offsetRight;
                    if (grid.paint.defaultUIStyle == "dark") {
                        paint.drawText(cell.linkText2, "rgb(200,200,200)", font3, tLeft, top + height / 2 - tSize4.cy / 2);
                    } else {
                        paint.drawText(cell.linkText2, "rgb(50,50,50)", font3, tLeft, top + height / 2 - tSize4.cy / 2);
                    }
                    paint.drawImage(cell.image2, tLeft + tSize6.cx + 10, top + height / 2 - 12, tLeft + tSize6.cx + 34, top + height / 2 + 12);
                } else {
                    let tLeft = left + width * rate2 + 5 + tSize5.cx / 2 - tSize6.cx / 2 + diffX - offsetRight;
                    if (grid.paint.defaultUIStyle == "dark") {
                        paint.drawText(cell.linkText2, "rgb(200,200,200)", font3, tLeft, top + height / 2 - tSize4.cy / 2);
                    } else {
                        paint.drawText(cell.linkText2, "rgb(50,50,50)", font3, tLeft, top + height / 2 - tSize4.cy / 2);
                    }
                    let tLeft1 = tLeft + tSize6.cx + 10;
                    tLeftRect = new FCRect(tLeft1 + 2, top + height / 2 - 10, tLeft1 + 20 - 2, top + height / 2 + 10);
                    if (grid.paint.defaultUIStyle == "dark") {
                        paint.drawRoundRect("rgb(170,178,189)", 1, 0, tLeftRect.left, tLeftRect.top, tLeftRect.right, tLeftRect.bottom, 2);
                        paint.drawLine("rgb(170,178,189)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4);
                        paint.drawLine("rgb(170,178,189)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 2, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 2);
                        paint.drawLine("rgb(170,178,189)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) * 3 / 4, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) * 3 / 4);
                    } else {
                        paint.drawRoundRect("rgb(175,175,175)", 1, 0, tLeftRect.left, tLeftRect.top, tLeftRect.right, tLeftRect.bottom, 2);
                        paint.drawLine("rgb(175,175,175)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 4);
                        paint.drawLine("rgb(175,175,175)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 2, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) / 2);
                        paint.drawLine("rgb(175,175,175)", 1, 0, tLeftRect.left + 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) * 3 / 4, tLeftRect.right - 4, tLeftRect.top + (tLeftRect.bottom - tLeftRect.top) * 3 / 4);
                    }
                }
            }
            if (tick > 0 && clickIndex == row.index) {
                let overTimes = tick;
                if (overTimes > 360) {
                    overTimes -= 360;
                }
                let dRect = new FCRect(left + 14, top + 5, right - 14, bottom - 5);
                let dWidth = Math.min(dRect.right - dRect.left, dRect.bottom - dRect.top);
                let dInterval = 20;
                let dcWidth = grid.size.cx * 1.5;
                let dcWidth2 = 400;
                if (paint.isMobile) {
                    dcWidth = grid.size.cx;
                    dcWidth2 = 200;
                }
                let showRect = new FCRect(-dcWidth2 + dcWidth * (360 - overTimes) / dcWidth2, dRect.top, dcWidth * (360 - overTimes) / dcWidth2, dRect.bottom);
                if (showRect.left < dRect.left) {
                    showRect.left = dRect.left;
                }
                if (showRect.left > dRect.right) {
                    showRect.left = dRect.right;
                }
                if (showRect.right < dRect.left) {
                    showRect.right = dRect.left;
                }
                if (showRect.right > dRect.right) {
                    showRect.right = dRect.right;
                }
                paint.fillRect("rgba(42,138,195,100)", showRect.left, showRect.top, showRect.right, showRect.bottom);
                paint.drawRect("rgb(42,138,195)", 1, 0, dRect.left, dRect.top, dRect.right, dRect.bottom);
                if (overTimes < 90) {
                    let fSize = (90 - overTimes) * (dWidth - dInterval) / 60;
                    let eSize = overTimes * (dWidth - dInterval) / 60;
                    paint.drawLine("rgba(42,138,195,200)", 3, 0, dRect.right - fSize, dRect.top, dRect.right, dRect.top);
                    paint.drawLine("rgba(42,138,195,200)", 3, 0, dRect.right, dRect.top, dRect.right, dRect.top + eSize);
                }
                else if (overTimes < 180) {
                    let fSize = (90 - (overTimes - 90)) * (dWidth - dInterval) / 60;
                    let eSize = (overTimes - 90) * (dWidth - dInterval) / 60;
                    paint.drawLine("rgba(42,138,195,200)", 3, 0, dRect.right, dRect.bottom - fSize, dRect.right, dRect.bottom);
                    paint.drawLine("rgba(42,138,195,200)", 3, 0, dRect.right, dRect.bottom, dRect.right - eSize, dRect.bottom);
                }
                else if (overTimes < 270) {
                    let fSize = (90 - (overTimes - 180)) * (dWidth - dInterval) / 60;
                    let eSize = (overTimes - 180) * (dWidth - dInterval) / 60;
                    paint.drawLine("rgba(42,138,195,200)", 3, 0, dRect.left, dRect.bottom, dRect.left + fSize, dRect.bottom);
                    paint.drawLine("rgba(42,138,195,200)", 3, 0, dRect.left, dRect.bottom, dRect.left, dRect.bottom - eSize);
                }
                else if (overTimes < 360) {
                    let fSize = (90 - (overTimes - 270)) * (dWidth - dInterval) / 60;
                    let eSize = (overTimes - 270) * (dWidth - dInterval) / 60;
                    paint.drawLine("rgba(42,138,195,200)", 3, 0, dRect.left, dRect.top, dRect.left + eSize, dRect.top);
                    paint.drawLine("rgba(42,138,195,200)", 3, 0, dRect.left, dRect.top, dRect.left, dRect.top + fSize);
                }
                let t1 = 6, t2 = 24;
                paint.beginPath();
                paint.addLine(dRect.left + t1, dRect.top + t2, dRect.left + t1, dRect.top + t1);
                paint.addLine(dRect.left + t1, dRect.top + t1, dRect.left + t2, dRect.top + t1);
                paint.drawPath("rgba(42,138,195,200)", 2, 0);
                paint.closePath();
                paint.beginPath();
                paint.addLine(dRect.left + t1, dRect.bottom - t2, dRect.left + t1, dRect.bottom - t1);
                paint.addLine(dRect.left + t1, dRect.bottom - t1, dRect.left + t2, dRect.bottom - t1);
                paint.drawPath("rgba(42,138,195,200)", 2, 0);
                paint.closePath();
                paint.beginPath();
                paint.addLine(dRect.right - t1, dRect.top + t2, dRect.right - t1, dRect.top + t1);
                paint.addLine(dRect.right - t1, dRect.top + t1, dRect.right - t2, dRect.top + t1);
                paint.drawPath("rgba(42,138,195,200)", 2, 0);
                paint.closePath();
                paint.beginPath();
                paint.addLine(dRect.right - t1, dRect.bottom - t2, dRect.right - t1, dRect.bottom - t1);
                paint.addLine(dRect.right - t1, dRect.bottom - t1, dRect.right - t2, dRect.bottom - t1);
                paint.drawPath("rgba(42,138,195,200)", 2, 0);
                paint.closePath();
            }
        };

        /*
        * 绘制列
        * grid:表格
        * column:列
        * paint:绘图对象
        * left:左侧坐标
        * top:上方坐标
        * right:右侧坐标
        * bottom:下方坐标
        */
        gPaint.onPaintGridColumn = function (grid, column, paint, left, top, right, bottom) {
        };

        /*
        * 重绘的实现方法
        * view:视图
        * paint:绘图对象
        * clipRect:裁剪区域
        */
        gPaint.onPaint = function (view, paint, clipRect) {
            buttonRects = [];
            onPaintDefault(view, paint, clipRect);
        };

        /*
        * 重绘边线的实现方法
        * view:视图
        * paint:绘图对象
        * clipRect:裁剪区域
        */
        gPaint.onPaintBorder = function (view, paint, clipRect) {
            onPaintBorderDefault(view, paint, clipRect);
            if (clickIndex >= 0) {
                let row = gList.rows[clickIndex];
                let cell = row.cells[0];
                let dFont = "Default,14";
                let gSize = paint.textSize(cell.text4, dFont);
                if (paint.isMobile || gSize.cx > gList.size.cx - 40) {
                    let lineCount = 1;
                    if (gList.size.cx > 40) {
                        lineCount = parseInt(gSize.cx / (gList.size.cx - 40)) + 1;
                    }
                    let bounds = new FCRect(0, clickIndex * gList.rowHeight + gList.headerHeight - gList.scrollV, gList.size.cx, (clickIndex + 1) * gList.rowHeight + gList.headerHeight - gList.scrollV);
                    if (bounds.top < gList.size.cy / 2) {
                        bounds.top += gList.rowHeight;
                        bounds.bottom += gList.rowHeight;
                        if (bounds.bottom - bounds.top - 60 < gSize.cy * lineCount) {
                            bounds.bottom = bounds.top + 60 + gSize.cy * lineCount;
                        }
                    } else {
                        bounds.top -= gList.rowHeight;
                        bounds.bottom -= gList.rowHeight;
                        if (bounds.bottom - bounds.top - 60 < gSize.cy * lineCount) {
                            bounds.top = bounds.bottom - 60 - gSize.cy * lineCount;
                        }
                    }
                    bounds.left += 10;
                    bounds.right -= 10;
                    let textColor = "rgb(200,200,200)";
                    if (paint.defaultUIStyle == "light") {
                        paint.fillRoundRect("rgba(240,240,240,200)", bounds.left, bounds.top, bounds.right, bounds.bottom, 0);
                        paint.drawRoundRect("rgb(175,175,175)", 1, 0, bounds.left, bounds.top, bounds.right, bounds.bottom, 0);
                        textColor = "rgb(50,50,50)";
                    } else {
                        paint.fillRoundRect("rgba(15,15,15,200)", bounds.left, bounds.top, bounds.right, bounds.bottom, 0);
                        paint.drawRoundRect("rgb(75,75,75)", 1, 0, bounds.left, bounds.top, bounds.right, bounds.bottom, 0);
                        textColor = "rgb(200,200,200)";
                    }
                    let drawText = "";
                    let dTop = bounds.top + 10;
                    let pos = 0;
                    let textLength = cell.text4.length;
                    while (pos < textLength) {
                        drawText += cell.text4[pos];
                        let dSize = paint.textSize(drawText, dFont);
                        if (dSize.cx > bounds.right - 40 || pos == textLength - 1) {
                            paint.drawText(drawText, textColor, dFont, bounds.left + 10, dTop);
                            drawText = "";
                            dTop += dSize.cy + 5;
                        }
                        pos++;
                    }
                }
            }
        };

        let checkPaint = function () {
            if (clickIndex != -1) {
                if (gPaint.isMobile) {
                    tick -= 20;
                } else {
                    tick -= 12;
                }
                if (tick <= 0) {
                    replayTick--;
                    if(replayTick <= 0){
                        tick = 0;
                        clickIndex = -1;
                    }else{
                        tick = 720;
                    }
                }
                invalidate(gPaint);
            }
        };

        let clickIndex = -1;
        let tick = 0;
        let replayTick = 0;
        setInterval(checkPaint, 30);
        gPaint.onClickGridCell = function (grid, row, column, cell, firstTouch, firstPoint, secondTouch, secondPoint, clicks) {
            let rate = 1 - 210 / grid.size.cx;
            if (gPaint.isMobile) {
                rate = 0.5;
            }
            if (firstPoint.x >= grid.size.cx * rate + cell.diffX && firstPoint.x <= grid.size.cx * rate + cell.diffX * 2) {
                window.location.href = cell.link2;
            } else if (firstPoint.x >= grid.size.cx * rate && firstPoint.x <= grid.size.cx * rate + cell.diffX) {
                window.location.href = cell.link;
            } else {
                clickIndex = row.index;
                tick = 720;
                replayTick = 10;
            }
        };

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "QStock财经数据";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用Python框架写的财经数据获取示例，用的第三方的QStock接口，做成了界面方便学习调用。";
            cell.link = "../document/templates/pic1.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/python/qstock";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/python.png";
            cell.linkType = "9";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "Mootdx财经数据";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用Python框架写的财经数据获取示例，用的第三方的Mootdx接口，做成了界面方便学习调用。";
            cell.link = "../document/templates/pic17.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/python/mootdx";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/python.png";
            cell.linkType = "1";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "K线分析";
            cell.text2 = "";
            cell.text3 = "示例应用";
            cell.text4 = "使用Win32框架制作了AI分析历史数据的工具，通过通达信导出的日线和分钟线数据，可以从大量数据中快速找到各种相似形态，也可以进行公式选股和模拟训练，我同时发布了32和64位版本，由于使用的C++8.0标准开发，不需要安装运行时等任何环境，Windows XP及以上版本都可以直接打开使用。";
            cell.link = "../document/templates/pic3.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/win32/kline";
            cell.linkText1 = "图片";
            cell.linkText2 = "下载";
            cell.image = "../images/cpp2.png";
            cell.linkType = "2";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "股票行情框架";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = " 服务端写了C#和Java两个版本，客户端写了个C#的示例，接收最新行情后自动与通达信导出的历史数据进行合并，既可以通过TCP进行推送，也可以用HTTP查询，前后端都支持复权因子和多周期数据的实时计算。";
            cell.link = "../document/templates/pic4.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/csharp/stockquote";
            cell.linkText1 = "图片";
            cell.linkText2 = "下载";
            cell.image = "../images/cs2.png";
            cell.linkType = "3";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "OwChart证券图形框架";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "花卷猫框架的轻量子集，全部使用C#构建界面。";
            cell.link = "https://mp.weixin.qq.com/s?__biz=Mzg5OTIzODg2Mw==&mid=2247484604&idx=1&sn=8efeff8a2766e105c0e3743cdaa9f838&chksm=c0571a1cf720930aa1c706a14eeed4e8e2f7a5cb990e066bce52ef53a1c84ed982d54cc9b664#rd";
            cell.link2 = "../software/owchart.zip";
            cell.linkText1 = "介绍";
            cell.linkText2 = "下载";
            cell.image = "../images/cs2.png";
            cell.linkType = "4";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP结算";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "完全自主实时计算期货的资金、持仓、盈亏、成交和委托，性能高效，结果准确，运行稳定。";
            cell.link = "../document/templates/pic7.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/cpp/ctpsif";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/cpp2.png";
            cell.linkType = "5";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-Python";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫Python框架和CTP结算库开发的期货交易程序示例，可以用作二次开发。";
            cell.link = "../document/templates/pic13.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/python/ctp";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/python.png";
            cell.linkType = "5";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-PyQt";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫Python框架，PyQt和CTP结算库开发的期货交易程序示例，可以用作二次开发。";
            cell.link = "../document/templates/ctppyqt.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/python/ctp_pyqt";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/qt.png";
            cell.linkType = "5";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-C++ Pro";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫C++轻量级框架和CTP结算库开发的期货交易程序示例，客户端和交易行情封装都在一份代码里，基础功能代码完整，代码达2万行，可以用作二次开发。";
            cell.link = "../document/templates/ctpcpp2.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/cpp/future";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/cpp2.png";
            cell.linkType = "6";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-C++";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫C++轻量级框架和CTP结算库开发的期货交易程序示例，可以用作二次开发。";
            cell.link = "../document/templates/pic10.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/cpp/ctp";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/cpp2.png";
            cell.linkType = "6";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-Java";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫Java框架和CTP结算库开发的期货交易程序示例，可以用作二次开发。";
            cell.link = "../document/templates/pic12.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/java/ctp";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/java.png";
            cell.linkType = "7";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-Html5";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫JavaScript框架和CTP结算库开发的期货交易程序示例，可以用作二次开发。";
            cell.link = "../document/templates/pic8.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/javascript/ctp";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/javascript.png";
            cell.linkType = "8";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-C#";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫C#轻量级框架和CTP结算库开发的期货交易程序示例，可以用作二次开发。";
            cell.link = "../document/templates/pic9.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/csharp/ctp";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/cs2.png";
            cell.linkType = "9";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-GO";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫Go框架和CTP结算库开发的期货交易程序示例，可以用作二次开发。";
            cell.link = "../document/templates/pic11.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/go/ctp";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/go.png";
            cell.linkType = "1";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-R";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫R框架和CTP结算库开发的期货交易程序示例，可以用作二次开发。";
            cell.link = "../document/templates/pic14.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/r/ctp";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/r.png";
            cell.linkType = "2";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-Min";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "CTP接口封装，使用C++开发，有Win32和Linux两个版本，直接明白，没有过多的逻辑，用于制作高频交易或行情转发。";
            cell.link = "../document/templates/pic15.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/cpp/ctpmin";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/cpp2.png";
            cell.linkType = "3";
            row.cells.push(cell);
        }
        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "平均涨跌幅";
            cell.text2 = "";
            cell.text3 = "示例应用";
            cell.text4 = "终端内置测试功能，计算所有品种整个历史的平均涨跌幅，相当于自定义指数。";
            cell.link = "https://mp.weixin.qq.com/s?__biz=Mzg5OTIzODg2Mw==&mid=2247486640&idx=1&sn=073a8e2a5c42f3b29a041f1d6930b559&chksm=c0571210f7209b06dd884afaf868cc8fdf61f57b1276d366eb7735824a8987a92510f8a517ab#rd";
            cell.link2 = "";
            cell.linkText1 = "介绍";
            cell.linkText2 = "";
            cell.linkType = "4";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "成交量预计";
            cell.text2 = "";
            cell.text3 = "示例应用";
            cell.text4 = "终端内置测试功能，在开盘不久的时候计算出全天的成交量预计值。";
            cell.link = "https://mp.weixin.qq.com/s?__biz=Mzg5OTIzODg2Mw==&mid=2247486644&idx=1&sn=21f6a7cf6c8d9ddd63111979bc3d7b09&chksm=c0571214f7209b02220ea6523cc937817d344c5d47b519d13d088742835ebd6863b82073e6e1#rd";
            cell.link2 = "";
            cell.linkText1 = "介绍";
            cell.linkText2 = "";
            cell.linkType = "5";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "金融板块数据";
            cell.text2 = "";
            cell.text3 = "示例应用";
            cell.text4 = "终端内置功能，获取各种证券金融板块的代码列表。";
            cell.link = "https://mp.weixin.qq.com/s?__biz=Mzg5OTIzODg2Mw==&mid=2247486274&idx=1&sn=3094c6740f512c8b5ccf88ba2c347b85&chksm=c05715e2f7209cf4c3654f557f729c369ebb10781363139ead3cfc24520cc5198450e3340be9#rd";
            cell.link2 = "";
            cell.linkText1 = "介绍";
            cell.linkText2 = "";
            cell.linkType = "6";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "网页版K线";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用JavaScript框架制作了网页版的K线示例，供二次开发使用，功能齐全，可以高频刷新，支持电脑和移动端响应式切换。";
            cell.link = "../document/templates/pic5.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/javascript/kline";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/javascript.png";
            cell.linkType = "7";
            row.cells.push(cell);
        }
        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "Python版K线";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用Python框架制作了客户端的K线示例，供二次开发使用，功能齐全，可以高频刷新，有Windows和MacOS两个版本。";
            cell.link = "../document/templates/pic6.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/python/kline";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/python.png";
            cell.linkType = "8";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "C#虚拟键盘";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用C#框架编写，适用于工控和快捷键设置等场景。";
            cell.link = "../document/templates/pic2.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/csharp/keyboard";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/cs2.png";
            cell.linkType = "9";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "Python+MySQL";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用Python框架制作了简易的MySQL数据库操作工具。";
            cell.link = "../document/templates/pic16.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/python/mysql";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/python.png";
            cell.linkType = "8";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "WebView2+Python";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用Python和WebView2开发的Windows客户端框架，使用花卷猫JavaScript框架来构建界面。";
            cell.link = "../document/templates/pywebview2.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/python/webview2";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/python.png";
            cell.linkType = "9";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "WebView2+Go";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用Go和WebView2开发的Windows客户端框架，使用花卷猫JavaScript框架来构建界面。";
            cell.link = "../document/templates/gowebview2.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/go/webview2";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/go.png";
            cell.linkType = "1";
            row.cells.push(cell);
        }
        
        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "WebView2+C#";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用C#和WebView2开发的Windows客户端框架，使用花卷猫JavaScript框架来构建界面。";
            cell.link = "../document/templates/cswebview2.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/csharp/webview2";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/cs2.png";
            cell.linkType = "2";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "WebView2+C++";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用C++和WebView2开发的Windows客户端框架，使用花卷猫JavaScript框架来构建界面。";
            cell.link = "../document/templates/cppwebview2.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/cpp/webview2";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/cpp2.png";
            cell.linkType = "3";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "WebView2Bridge";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "多语言与WebView2通讯的C++源代码，可以自行编译或修改。";
            cell.link = "../document/templates/facecatbridge.jpg";
            cell.link2 = "https://gitee.com/facecat007/template/tree/master/cpp/facecatbridge";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/cpp2.png";
            cell.linkType = "4";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-Python Skia";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫Python框架和CTP结算库开发的期货交易程序示例，可以用作二次开发，使用性能更高的绘图引擎，但打包体积增大。";
            cell.link = "../document/templates/pic13.jpg";
            cell.link2 = "https://gitee.com/facecat007/template2/tree/master/python/ctp_fast";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/python.png";
            cell.linkType = "5";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "Python版K线 Skia";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用Python框架制作了客户端的K线示例，供二次开发使用，功能齐全，可以高频刷新，使用性能更高的绘图引擎，但打包体积增大。";
            cell.link = "../document/templates/pic6.jpg";
            cell.link2 = "https://gitee.com/facecat007/template2/tree/master/python/kline_fast";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/python.png";
            cell.linkType = "6";
            row.cells.push(cell);
        }

        if (true) {
            let row = new FCGridRow;
            gList.rows.push(row);
            let cell = new FCGridCell();
            cell.font = "Default,16";
            cell.colSpan = 1;
            cell.rowSpan = 1;
            cell.text1 = "CTP-GO Skia";
            cell.text2 = "";
            cell.text3 = "示例代码";
            cell.text4 = "使用花卷猫Go框架和CTP结算库开发的期货交易程序示例，可以用作二次开发，使用性能更高的绘图引擎，但打包体积增大。";
            cell.link = "../document/templates/pic11.jpg";
            cell.link2 = "https://gitee.com/facecat007/template2/tree/master/go/ctp_fast";
            cell.linkText1 = "图片";
            cell.linkText2 = "开源";
            cell.image = "../images/go.png";
            cell.linkType = "7";
            row.cells.push(cell);
        }

        updateViewDefault(gPaint.views);
        //刷新界面
        invalidate(gPaint);
    </script>
</body>
</html>
